package models;

import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.swing.text.StyledEditorKit.BoldAction;

import controllers.GeradorDeEmails;
import controllers.GeradorDePDF;

import play.data.validation.Required;
import play.db.jpa.Blob;
import play.db.jpa.Model;

@Entity
public class Requerimento extends Model{

	@Required
	public String aluno;
	@Required
	public String matricula;
	public String endereco;
	public String numero;
	public String bairro;
	public String cidade;
	public String uf;
	public String cep;
	public String fone;
	@Required
	public String email;
	@Required
	@Lob
	public String justificativa;
	@Required
	public String requerimento;
	public Date date;
	public int aprovado;
	@Required
	public int encerrado;//0 nao encerrado e 1 encerrado 

	public String photoFileName;
	public Blob photo;
	/**
	 * Construtor 
	 * @param aluno nome do aluno
	 * @param matricula
	 * @param endereco
	 * @param bairro
	 * @param cidade
	 * @param uf
	 * @param cep
	 * @param fone
	 * @param celular
	 * @param email
	 * @param justificativa
	 * @param requerimento
	 */
	public Requerimento( String aluno, String matricula,String endereco,String bairro,
			String cidade,String uf,String cep,String fone,String email,String justificativa, 
			String requerimento){

		this.aluno = aluno;
		this.matricula = matricula;
		this.endereco = endereco;
		this.bairro = bairro;
		this.cidade = cidade;
		this.uf = uf;
		this.cep = cep;
		this.fone = fone;
		this.email = email;
		this.justificativa = justificativa;
		this.requerimento = requerimento;
		this.encerrado = 0;
		this.aprovado = 0;
	}

	/**
	 * informa se o requerimento foi aceito ou nao 
	 * @return true se aceito e false se recusado
	 */
	public boolean isAprovado(){
		List<Voto> votos = Voto.getVotosPorRequerimento(this);

		//ERRO
		//se ninguem houver votado
		if(votos.size() == 0) return false;

		//variaveis de contagem
		int aprovadoCount = 0;
		int recusadoCount = 0;

		for (Voto voto : votos) {
			if(voto.isAceito)aprovadoCount++;
			if(!voto.isAceito)recusadoCount++;

			//se houver um minerva, o voto sera a decisao final
			if(voto.minerva){
				return voto.isAceito;
			} 
		}

		return (aprovadoCount>recusadoCount)?true:false;
	}

	/**
	 * informa se o usuario ja votou ou nao no requerimento
	 * @param usuario quem quer ser verificado
	 * @return true se ja votou e false se nao
	 */
	public boolean jaVotou(Usuario usuario){
		System.out.println(usuario.id +" "+ this.id);
		if(Voto.getVotoPorRequerimentoUsuario(this, usuario)!= null)
			return true;
		else 
			return false;

	}

	/**
	 * informa se a votacao do requerimento ja foii encerrada
	 * @return true se foi e false se nao
	 */
	public boolean verificaEncerramento(){

		//se houver um voto de minerva
		if(Voto.getVotoMinerva(this)!= null)
			return true;
		//se nao houver voto de minerva
		else{
			//quantidade de votos que acetaram
			int aceito = Voto.getAceitos(this).size();
			//quantidade de votos que recusaram
			int recusado = Voto.getRejeitados(this).size();
			//quantidade de membros do colegiado
			int quantidadeColegiado = (int) Usuario.count();

			// se algum dos votos for maioria em relacao ao numero do colegiado
			if(aceito>(quantidadeColegiado/2) || recusado>(quantidadeColegiado/2))
				return true;	
		}
		return false;
	}



	/**
	 * informa os requerimentos pendentes
	 * @return lista de requerimentos que nao estao encerrados
	 */
	public static List<Requerimento> getPendentes(){
		return Requerimento.find("byEncerrado", 0).fetch();
	}

	
	public static List<Requerimento> getRequerimentosEncerrados(){
		return Requerimento.find("byEncerrado", 1).fetch();
	}
	
	

}